/**
 * @file NewtonPoly.h
 * @brief Newton(Hermite)插值多项式
 * 
 * 这个头文件提供了五个函数,可以实现获得给定点的差商表,打印差商表,
 * 获取插值多项式以及其在某点x处的函数值/导数值等功能.
 * 
 * @author 叶陈昊
 * @date 2023/10/17 
 */

#ifndef NEWTONPOLY_H_
#define NEWTONPOLY_H_

#include<iostream>
#include<vector>
using namespace std;

/*print Newton interpolation polynomail*/
void Newton_poly(const vector<double> &inter_pts,
                 const vector<double> &vals_of_pts);

/*get the value of the Newton interpolation polynomial at x*/
double Newton_poly_at_x(const vector<double> &inter_pts,
                        const vector<double> &vals_of_pts,
                        double x);

/*get the derivative of the Newton interpolation polynomail at x*/
double Newton_dif_at_x(const vector<double> &inter_pts,
                       const vector<double> &vals_of_pts,
                       double x);

/**
 * @brief get the table of divided differences(含广义差商)
 * 
 * 普通的Newton法传入n个不同插值点及对应的函数值.
 * 当(Hermite插值)还需要传入某插值点的导数值时,将该插值点重复传入一次,
 * 即该函数提供广义的差商表.
 * 
 * 例子:
 * (1)Theoretical questions V
 * 传入的插值点:{0, 1, 1, 1, 2, 2};
 * 传入的函数值(导数值):{f(0),f(1),f'(1),f"(1)/2,f(2),f'(2)}
 *                  ={0, 1, 7, 42/2=21, 128, 448}.
 * (2)Theoretical questions VI
 * 传入的插值点:{0, 1, 1, 3, 3};
 * 传入的函数值(导数值):{f(0),f(1),f'(1),f(3),f'(3)}
 *                  ={1, 2, -1, 0, 0}.
 * 
 * @attention 希望传入的插值点是由小到大依次排列的(主要是方便广义差商的计算)
 */
vector<vector<double>> get_diff_table(const vector<double> &inter_pts,
                                      const vector<double> &vals_of_pts);

/*print the table of divided differences*/
void print_diff_table(const vector<vector<double>> &diff_table);

#endif